#include "Queue.h"
#define _CRT_SECURE_NO_WARNINGS 1

void QueueInit(Queue* q)
{
	assert(q);
	q->_front = NULL;
	q->_rear = NULL;
	q->_size = 0;
}

void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* newNode = (QNode*)malloc(sizeof(QNode));
	if (!newNode)
	{
		perror("Malloc failed");
	}
	newNode->_data = data;
	newNode->_next = NULL;
	if (!q->_rear)
	{
		q->_front = q->_rear = newNode;
	}
	else
	{
		q->_rear->_next = newNode;
		q->_rear = newNode;
	}
	q->_size++;
}

void QueuePop(Queue* q)
{
	assert(q);
	if (q->_front == q->_rear)
	{
		free(q->_front);
		q->_front = q->_rear = NULL;
	}
	else
	{
		QNode* ne = q->_front->_next;
		free(q->_front);
		q->_front = ne;
	}
	q->_size--;
}

QDataType QueueFront(Queue* q)
{
	return q->_front->_data;
}

QDataType QueueBack(Queue* q)
{
	assert(q);
	return q->_rear->_data;
}

int QueueSize(Queue* q)
{
	assert(q);
	return q->_size;
}

int QueueEmpty(Queue* q)
{
	return !q->_size;
}

void QueueDestroy(Queue* q)
{
	while (q->_front)
	{
		QNode* ne = q->_front->_next;
		free(q->_front);
		q->_front = ne;
	}
	q->_front = NULL;
	q->_rear = NULL;
	q->_size = 0;
}
